﻿package Naruto{
	/**
	 * import 
	 *
	 */
	import flash.display.*

	/**
	 * 再不斩
	 * 
	 * 
	 */
	public class Zabuza {
		/**
		 * 舞台
		 * 
		 */
		private var _stage : Stage = null;

		/**
		 * 头像
		 * 
		 */
		private var _header : Sprite = null;

		/**
		 * 生命值
		 *
		 */
		private var _health : Number;

		/**
		 * 角度
		 * 
		 */
		private var _angle : Number;

		/**
		 * 沿 X 轴运动方向
		 *
		 */
		public var _directionX : int = -1;

		/**
		 * 沿 Y 轴运动方向
		 *
		 */
		public var _directionY : int = -1;

		/**
		 * 运动速度
		 *
		 */
		public var _v : Number = -1;
		

		private var _isInSide:Boolean;	//是否在边界区域
		private var _isHided:Boolean;	//是否雾隐
		private var _aiAttack:Attack;	
		private var _aiStatus:int = 1; //初始化为活着。0:死了。1:活着

		/**
		 * 类参数构造器
		 * 
		 * @param st 
		 * @param header 
		 * 
		 */
		public function Zabuza(st : Stage, header : Sprite) {
			if (st == null) {
				throw new Error("参数 st 为空");
			}

			if (header == null) {
				throw new Error("参数 header 为空");
			}

			this._stage = st;
			this._header = header;

			this._aiStatus = 1;
			this._isHided = false;
			this._health = 100;

			this._isInSide = false;
			this._aiAttack = new Attack();

			// 设置初始化位置
			this._header.x = _stage.stageWidth / 2;
			this._header.y = _stage.stageHeight / 4;

			// 随机生成一个锐角
			this._angle = this.newAngle(0);
			// 沿 X 轴运动方向
			this._directionX = +1;
			// 沿 Y 轴运动方向
			this._directionY = +1;
			// 运动速度
			this._v = 7.0;
		}
		
		public function getStatus(){
			return this._aiStatus;
		}
		public function setStatus(newStatus:int){
			this._aiStatus = newStatus;
		}

		public function getIsHided(){
			return this._isHided;
		}

		public function setIsHided(hideStatus:Boolean){
			this._isHided = hideStatus;
		}
		public function getHealth(){
			return this._health;
		}
		
		public function getme(){
			return this._header;
		}

		/**
		 * 获取 X 轴位置
		 * 
		 * @return 
		 * 
		 */
		public function getPosX() : Number {
			return this._header.x;
		}

		/**
		 * 设置 X 轴位置
		 * 
		 * @param value 
		 * 
		 */
		public function setPosX(value : Number) : void {
			this._header.x = value;
		}

		/**
		 * 获取 Y 轴位置
		 * 
		 * @return 
		 * 
		 */
		public function getPosY() : Number {
			return this._header.y;
		}

		/**
		 * 设置 Y 轴位置
		 * 
		 * @param value 
		 * 
		 */
		public function setPosY(value : Number) : void {
			this._header.y = value;
		}

		/**
		 * 移动并攻击
		 *
		 */
		public function moving() : void {
			// 获取旧 X 轴 Y 轴位置
			var old_x : Number = this.getPosX();
			var old_y : Number = this.getPosY();

			// 获取一个新锐角
			this._angle = this.newAngle(this._angle);
			
			if (old_x >= this._stage.width - this._header.width) {
				// 如果 X 轴位置已经到达屏幕最右侧, 
				// 并且沿 X 轴运动方向为正方向, 则将运动方向置为负方向
				if (this._directionX == +1) {
					this._directionX = -1;
				}
			}
			
			if (old_x <= 20) {
				// 如果 X 轴位置已经到达屏幕最左侧, 
				// 并且沿 X 轴运动方向为负方向, 则将运动方向置为正方向
				if (this._directionX == -1) {
					this._directionX = +1;
				}
			}
			
			// 如果 X 轴位置是处在屏幕中央区域, 
			// 则可以随机改变运动方向
			if (old_x >= this._stage.width / 4 * 1 && 
				old_x <= this._stage.width / 4 * 3) {
				this._directionX *= Math.random() >= 0.98 ? -1 : +1;
			}

			// 如果 Y 轴位置是处在屏幕中央区域, 
			// 则可以随机改变运动方向
			if (old_y >= this._stage.height / 4 * 1 && 
				old_y <= this._stage.height / 4 * 3) {
				this._directionY *= Math.random() >= 0.98 ? -1 : +1;
			}
			
			if (old_y >= this._stage.height - this._header.height) {
				// 如果 Y 轴位置已经到达屏幕最下侧, 
				// 并且沿 Y 轴运动方向为正方向, 则将运动方向置为负方向
				if (this._directionY == +1) {
					this._directionY = -1;
				}
			}
			
			if (old_y <= 20) {
				// 如果 Y 轴位置已经到达屏幕最上侧, 
				// 并且沿 Y 轴运动方向为负方向, 则将运动方向置为正方向
				if (this._directionY == -1) {
					this._directionY = +1;
				}
			}

			var new_x : Number = Math.cos(this._angle) * this._v * this._directionX + old_x;
			var new_y : Number = Math.sin(this._angle) * this._v * this._directionY + old_y;

			this.setPosX(new_x);
			this.setPosY(new_y);
		}
		
		/**
		 * 获取一个新锐角
		 * 
		 * @param oldAngle 
		 * @return 
		 * 
		 */
		private function newAngle(oldAngle : Number) : Number {
			if (Math.random() >= 0.96) {
				return (Math.PI / 180) * (90 * Math.random());
			}

			return oldAngle;
		}
		
		public function getAttack(){
			return this._aiAttack;
		}		
		
		public function hurtMe(blood,modulus){
			switch(modulus){
				case 0:{
						this._health -= 5;
						//trace("Zabuza's health = " + this._health);
						blood.changeBossHealth(this._health);
						break;
						}
				case 1:{
						this._health -= 10;
						//trace("Health:" + this.health);
						blood.changeBossHealth(this._health);
						break;}
				default:this._health -= 10*0.1;break;
			}
		}
		
		public function removeBoss():void{	//删除舞台Boss
			if (this._stage.contains(this._header)) {
				this._stage.removeChild(this._header);
			}
		}
	}	
}